import axios from 'axios'
import serives from './config.js'
import Qs from 'qs'
// 根据对应ui组件进行添加加载和提示的组件
// import toast from 'element/vant';
// import tips from 'element/vant';

// 当前环境变量
const ENV = import.meta.env.VITE_ENV
// 配置接口前缀
const getService = (serviceUrl) => {
  if(ENV === 'development') {
    axios.defaults.baseURL = '/api'
  }else {
    axios.defaults.baseURL = serives[ENV][serviceUrl]
  }
}
// loading
// let t = null;
// 正在进行中的请求列表
const requestList = []

/**
 * 阻止重复请求
 * @param {string} url  请求url地址
 * @param {func} cancel 请求中断函数
 */
const stopRepeatRequest = (url, cancel) => {
  for (let i = 0, len = requestList.length; i < len; i++) {
    if (requestList[i] === url) {
      cancel(url)
      return
    }
  }
  requestList.push(url)
}

/**
 * 允许某个请求可以继续进行
 * @param {string} url 请求url地址
 */
const allowRequest = (url) => {
  for (let i = 0, len = requestList.length; i < len; i++) {
    if (requestList[i] === url) {
      requestList.splice(i, 1)
      break
    }
  }
}

/**
 * 获取config
 * @param {Object} config 配置信息
 * @returns {*}
 */
const getConfig = config => ({
  // 接口地址
  url: config.url || '',
  // 接口参数
  params: config.params,
  // 加载过程中是否显示loading
  loading: typeof config.loading === 'boolean' ? config.loading : true,
  // 接口前缀（这里主要是在该项目对应多人开发时使用）
  servicePrefix: config.servicePrefix || '',
  // 请求主体被发送的数据
  data: config.params || {}
})

/**
 * 显示loading
 * @param {Boolean} status 状态
 */
const showLoading = (status) => {
  if (status) {
    // t = toast({
    //   type: 'loading',
    //   duration: 200000,
    //   message: '加载中...'
    // });
  }
}

/**
 * 隐藏loading
 * @param {Boolean} status 状态
 */
const hideLoading = (status) => {
  if (status) {
    // t.show = false;
  }
}

// 请求超时
axios.defaults.timeout = 60000
// post 请求头的设置
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'

// 请求拦截器
axios.interceptors.request.use(
  (config) => {
    let cancel = null
    // let token = '';

    // 请求头添加token[视项目情况而定进行token添加]
    // if (typeof token === 'string' && token !== '') {
    //   config.headers.Authorization = `Bearer ${ token }`;
    // }

    // 设置cancelToken对象
    config.cancelToken = new axios.CancelToken(function executor(c) {
      cancel = c
    })
    // 默认参数添加
    let params = {
      siteCode:serives.site
    }
    config.params = Object.assign(params, config.params)
    // 取消请求
    stopRepeatRequest(
      `${ config.url }?${ Qs.stringify(config.params) }&method=${ config.method }`,
      cancel,
      `${ config.url } 请求被中断`
    )
    return config
  },
  error => Promise.error(error)
)

// 响应拦截器
axios.interceptors.response.use(
  (response) => {
    const CONFIG = response.config
    allowRequest(`${ CONFIG.url }?${ Qs.stringify(CONFIG.params) }&method=${ CONFIG.method }`)
    const status = response.status
    const code = response.data.code
    switch (status) {
    case 200:
      switch (code) {
      // 发送成功
      case 0:
        return Promise.resolve(response.data)
      default:
        // tips({
        //   show: true,
        //   duration: 2000,
        //   message: response.data && response.data.message ? response.data.message : '接口出错'
        // });
        return Promise.resolve(response.data)
      }
    default:
      return Promise.reject(response)
    }
  },
  (error) => {
    if (error.config) {
      allowRequest(`${ error.config.url }?${ Qs.stringify(error.config.params) }&method=${ error.config.method }`)
    }
    if (error.message) {
      allowRequest(`${ error.message }`)
    }
    const response = error.response
    if (!response) {
      // tips({
      //   show: true,
      //   duration: 2000,
      //   message: '服务器错误'
      // });
      return Promise.resolve(error)
    }
    if (response.data && response.data.message) {
      // tips({
      //   show: true,
      //   duration: 2000,
      //   message: response.data.message
      // });
    }
    return Promise.reject(response.data)
  }
)

/**
 * get请求
 * @param {Object} params 接口参数
 * @returns {Promise<any>}
 */
export function get(params) {
  // 获取合并后的params
  const conf = getConfig(params)
  showLoading(conf.loading)
  if (conf.servicePrefix) {
    getService(conf.servicePrefix)
  }
  return new Promise((resolve, reject) => {
    axios.get(conf.url, {
      params: {
        ...conf.params
      }
    }).then((res) => {
      hideLoading(conf.loading)
      resolve(res)
    })
      .catch((err) => {
        hideLoading(conf.loading)
        reject(err)
      })
  })
}

/**
 * post方法
 * @param {Object} params 接口参数
 * @returns {Promise<any>}
 */
export function post(params) {
  // 获取合并后的params
  const conf = getConfig(params)
  showLoading(conf.loading)
  if (conf.servicePrefix) {
    getService(conf.servicePrefix)
  }
  return new Promise((resolve, reject) => {
    axios.post(conf.url,
      conf.data
    ).then((res) => {
      hideLoading(conf.loading)
      resolve(res)
    })
      .catch((err) => {
        hideLoading(conf.loading)
        reject(err)
      })
  })
}
